package cn.asiontang.db;

import android.content.ContentValues;
import android.os.Parcel;

import cn.asiontang.utils.TextUtils;

/**
 * @author AsionTang
 * @since 2013年9月11日
 */
public class BaseEntity
{
    private final ContentValues mValues = new ContentValues();

    public BaseEntity()
    {
    }

    /**
     * 实现将需要实现的函数，写入父类，子类继承自 Parcelable 时，就无需写这些冗余代码了。当子类需要【自定义】时，重载即可。
     */
    public int describeContents()
    {
        return 0;
    }

    public String getValue(final String key)
    {
        if (this.mValues == null)
            throw new NullPointerException();
        return this.mValues.getAsString(key);
    }

    /**
     * 获取的值，当值为Null时，返回空“”，而不是Null。
     */
    public String getValueNoNull(final String key)
    {
        if (this.mValues == null)
            throw new NullPointerException();
        return TextUtils.valueOfNoNull(this.mValues.getAsString(key));
    }

    public ContentValues getValues()
    {
        return this.mValues;
    }

    public void setValue(final String key, final String value)
    {
        if (this.mValues == null)
            throw new NullPointerException();
        this.mValues.put(key, value);
    }

    /**
     * 默认设置Values时，会先清空原集合。
     */
    public <T extends BaseEntity> T setValues(final ContentValues values)
    {
        return this.setValues(values, true);
    }

    /**
     * 设置集合内容。可设置是否清空原集合内容。
     */
    @SuppressWarnings("unchecked")
    public <T extends BaseEntity> T setValues(final ContentValues values, final boolean needClearValues)
    {
        if (values == null)
            throw new NullPointerException();
        if (needClearValues)
            this.mValues.clear();
        this.mValues.putAll(values);
        return (T) this;
    }

    /**
     * 直接支持从 Parcel 里读取出值给当前Entity赋值。
     */
    protected <T extends BaseEntity> T setValues(final Parcel in)
    {
        return this.setValues(in.<ContentValues>readParcelable(BaseEntity.class.getClassLoader()));
    }

    @Override
    public String toString()
    {
        return this.mValues.toString();
    }

    /**
     * 实现将需要实现的函数，写入父类，子类继承自 Parcelable 时，就无需写这些冗余代码了。当子类需要【自定义】时，重载即可。
     */
    public void writeToParcel(final Parcel dest, final int flags)
    {
        dest.writeParcelable(this.mValues, 0);
    }
}